package br.com.dataphonebr;

import java.util.Date;
import java.util.List;

import android.app.AlertDialog;
import android.app.Dialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.DialogInterface.OnClickListener;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.EditText;
import android.widget.LinearLayout;
import android.widget.TextView;
import br.com.dataphonebr.AdministratorListActivity.ProcessoItem;
import br.com.dataphonebr.adapter.AppointmentAdapter;
import br.com.dataphonebr.entity.Atividade;
import br.com.dataphonebr.entity.Grupo;
import br.com.dataphonebr.enumerator.PeriodoNotificacao;
import br.com.dataphonebr.enumerator.Prioridade;
import br.com.dataphonebr.enumerator.StatusAtividade;
import br.com.dataphonebr.service.AtividadeService;
import br.com.dataphonebr.service.GrupoService;
import br.com.dataphonebr.util.MessagesUtil;
import br.com.dataphonebr.util.Util;

public class ResultSearchAdmActivity extends GenericActivity<Atividade>{
	
//	private AdministratorListAdapter admListener = new AdministratorListAdapter(this);
	private AtividadeService atividadeService;
	private List<Atividade> atividades;
	private AlertDialog alertDialogConcluida;
	private AlertDialog alertDialogCancelada;
//	private TextView popupBtn;
	private Dialog notesDialog;
	private CheckBox desativarRepeticao;
	private Button finalizeAppointmentBtn;
	private Button cancelAppointmentBtn;
	private EditText notasFinalizacao;
	private ProcessoItem processo;
	private GrupoService grupoService;
	
	public ResultSearchAdmActivity() {
		super(Atividade.class);
	}
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_result_search_adm);
		getActionBar().setDisplayHomeAsUpEnabled(true);
		init();
	}
	
	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		MenuInflater inflater = getMenuInflater();
		inflater.inflate(R.menu.result_search_adm, menu);
		return true;
	}
	
	@Override
	public boolean onOptionsItemSelected(MenuItem item) {
		showProgressBar(ResultSearchAdmActivity.this, null);
		switch (item.getItemId()) {
	    case R.id.addResultSearchAdmActionMenu:
			List<Grupo> grupos = grupoService.selectAll();
			if (grupos != null && !grupos.isEmpty()){
				Intent intent = new Intent(ResultSearchAdmActivity.this, AppointmentActivity.class);
				intent.putExtra(Util.COMING_FROM, R.layout.activity_search_adm);
				startActivity(intent);
				finish();
				return true;
	    	} 
	        util.showToastMessageLong(getString(R.string.msg_no_group_registered), this);
	        return false;
	    case android.R.id.home:
	    	openView(ResultSearchAdmActivity.this, SearchAdmActivity.class, true);
	    	return true;
	    case R.id.sendMailResultSearchAdmActionMenu:
			atividadeService.generatePDF(atividades);
			util.showToastMessageLong(getString(R.string.msg_email_sent_successfully), this);
	    	return true;
	    default:
	        return super.onOptionsItemSelected(item);
	    }
	}
	
	@Override
	public void init(){
		atividadeService = new AtividadeService(this);
		grupoService = new GrupoService(this);
		this.pesquisar();
		super.init();
	}
	
	private void pesquisar(){
		Atividade atividade = new Atividade();
		Grupo grupo = new Grupo();
 		grupo.setCodigo(getIntent().getExtras().getLong("grupo"));
		atividade.setGrupo(grupo);
		atividade.setTitulo(getIntent().getExtras().getString("titulo"));
		atividade.setDataIni((Date)getIntent().getExtras().getSerializable("dataInicial"));
		atividade.setDataFim((Date)getIntent().getExtras().getSerializable("dataFinal"));
		int status = getIntent().getExtras().getInt("status");
		atividade.setStatus(StatusAtividade.getStatusAtividadeByIndex(status));
		int prioridade = getIntent().getExtras().getInt("prioridade");
		atividade.setPrioridade(Prioridade.getPrioridadeByIndex(prioridade));
		atividades = atividadeService.selectAtividades(atividade);
	}
	
	@Override
	public void prepareComponents() {
		setListView(newListView(R.id.resultSearchAdmListView));
		adapter = new AppointmentAdapter(atividades);
		getListView().setAdapter(adapter);
		getListView().setOnItemClickListener(itemClick);
		CharSequence[] options = {getString(R.string.alert_edit_adm), getString(R.string.alert_duplicate_adm), getString(R.string.alert_remove_adm), getString(R.string.alert_finalize_adm)};
		alertDialog = super.createDialog(getString(R.string.optionsLabel), onClickNaoConcluidas, options);
		alertDialogConcluida = super.createDialog(getString(R.string.optionsLabel), onClickConcluidas, getString(R.string.alert_display_adm), getString(R.string.alert_duplicate_adm), getString(R.string.alert_remove_adm));
		alertDialogCancelada = super.createDialog(getString(R.string.optionsLabel), onClickCanceladas, getString(R.string.alert_display_adm), getString(R.string.alert_duplicate_adm), getString(R.string.alert_reactive_adm), getString(R.string.alert_remove_adm));
		alertYesNo = super.createDialogYesNo(onClickNaoConcluidas);
		notesDialog = atividadeService.criarPopupFinalizacao(this, getInstance());
		if (notesDialog != null){
			desativarRepeticao = (CheckBox) notesDialog.findViewById(R.id.checkBoxCancelarAdm);
			notasFinalizacao = (EditText)notesDialog.findViewById(R.id.notasFinalizacaoAdm);
			finalizeAppointmentBtn = (Button) notesDialog.findViewById(R.id.finalizeBtnAdm);
			finalizeAppointmentBtn.setOnClickListener(finalizeClick);
			cancelAppointmentBtn = (Button) notesDialog.findViewById(R.id.cancelBtnAdm);
			cancelAppointmentBtn.setOnClickListener(finalizeClick);
		}

		LinearLayout statusLayout= (LinearLayout )findViewById(R.id.itemAppointmentLayout);
		LayoutInflater inflater = getLayoutInflater();
		View homeView = inflater.inflate(R.layout.item_appointment_row, statusLayout);
//		popupBtn = (TextView)homeView.findViewById(R.id.exibirDadosAdmResultBtn);
		
		super.prepareComponents();
	}
	
	View.OnClickListener finalizeClick = new View.OnClickListener() {
	    public void onClick(View v) {
	    	switch (v.getId()){
		    	case R.id.finalizeBtnAdm : {
		    		String mensagem = "";
		    		if (processo.equals(ProcessoItem.FINALIZAR)){
		    			mensagem = MessagesUtil.getFinalizeActivity(getInstance(), ResultSearchAdmActivity.this, desativarRepeticao!=null?desativarRepeticao.isChecked():false);
		    		}  
		    		if (processo.equals(ProcessoItem.CANCELAR)){
		    			mensagem = MessagesUtil.getCancelActivity(getInstance(), ResultSearchAdmActivity.this);
		    		}
		    		alertYesNo.setMessage(mensagem);
					alertYesNo.show();
		    	}
		    	break;
		    	case R.id.cancelBtnAdm : {
		    		notesDialog.dismiss();
		    	}
		    	break;
	    	}
	    }
	  };

	  
	OnClickListener onClickNaoConcluidas = new OnClickListener() {
		
		@Override
		public void onClick(DialogInterface dialog, int which) {
			showProgressBar(ResultSearchAdmActivity.this, null);
			switch (which) {
			case 0:
				loadInstance(AppointmentActivity.class, atividadeService.getColumnHack(), getInstance().getCodigo(), true, R.layout.activity_search_adm);
				break;
			case 1:
				duplicate(AppointmentActivity.class, atividadeService.getColumnHack(), getInstance().getCodigo(), R.layout.activity_search_adm);
				break;
			case 2:
				if (getInstance() != null && getInstance().getCodigo() != null){
					processo = ProcessoItem.EXCLUIR;
					alertYesNo.setMessage(getString(R.string.remove_appointment_message, getInstance().getTitulo()));
					alertYesNo.show();
				}
				break;
			case 3:
				if (getInstance() != null && getInstance().getCodigo() != null){
					processo = ProcessoItem.CANCELAR;
					TextView titulo = (TextView)notesDialog.findViewById(R.id.tituloPopupNotesAdm);
					titulo.setText(getString(R.string.notes_popup_cancel_adm));
					desativarRepeticao.setVisibility(View.GONE);
					notasFinalizacao.setText("");
					notesDialog.show();
				}
				break;
			case 4:
				if (getInstance() != null && getInstance().getCodigo() != null){
					processo = ProcessoItem.FINALIZAR;
					TextView titulo = (TextView)notesDialog.findViewById(R.id.tituloPopupNotesAdm);
					titulo.setText(getString(R.string.notes_popup_finalize_adm));
					if (getInstance().getPeriodoNotificacao().equals(PeriodoNotificacao.NENHUM)){
						desativarRepeticao.setVisibility(View.GONE);
					} else {
						desativarRepeticao.setVisibility(View.VISIBLE);
						desativarRepeticao.setChecked(false);
					}
					notasFinalizacao.setText("");
					notesDialog.show();
				}
				break;
			case 5:
				if (getInstance() != null && getInstance().getCodigo() != null){
					processo = ProcessoItem.RENOVAR;
					alertYesNo.setMessage("Ao renovar a atividade, o hist�rico de finaliza��o n�o ser� guardado. Deseja realmente renovar a atividade "+getInstance().getTitulo()+"? ");
					alertYesNo.show();
				}
				break;
			case DialogInterface.BUTTON_POSITIVE:
//					TODO: Incluir regras de negocio de exclus�o.
				if (processo != null){
					if (processo.equals(ProcessoItem.EXCLUIR)){
						atividadeService.delete(getInstance().getCodigo());
					}
					if (processo.equals(ProcessoItem.FINALIZAR)){
						getInstance().setNotasFinalizacao(notasFinalizacao.getText().toString());
						getInstance().setDesativarRepeticao(desativarRepeticao.isChecked());
						atividadeService.finalizar(getInstance(), credentialsService.getUsuarioLogado());
						notesDialog.dismiss();
					}
					if (processo.equals(ProcessoItem.CANCELAR)){
						getInstance().setMotivoCancelamento(notasFinalizacao.getText().toString());
						atividadeService.cancelar(getInstance(), credentialsService.getUsuarioLogado());
						notesDialog.dismiss();
					}
					if (processo.equals(ProcessoItem.RENOVAR) || processo.equals(ProcessoItem.REATIVAR)){
						atividadeService.reativar(getInstance(), credentialsService.getUsuarioLogado());
					}
				}
				pesquisar();
				adapter = new AppointmentAdapter(atividades);
				getListView().setAdapter(adapter);
				break;
			case DialogInterface.BUTTON_NEGATIVE:
				alertYesNo.dismiss();
				break;
			}			
		}
	};
		
		
	OnClickListener onClickConcluidas = new OnClickListener() {
		
		@Override
		public void onClick(DialogInterface dialog, int which) {
			showProgressBar(ResultSearchAdmActivity.this, null);
			switch (which) {
			case 0:
				loadInstance(AppointmentActivity.class, atividadeService.getColumnHack(), getInstance().getCodigo(), false, R.layout.activity_result_search_adm);
				break;
			case 1:
				duplicate(AppointmentActivity.class, atividadeService.getColumnHack(), getInstance().getCodigo(), R.layout.activity_search_adm);
				break;
			case 2:
				if (getInstance() != null && getInstance().getCodigo() != null){
					processo = ProcessoItem.EXCLUIR;
					alertYesNo.setMessage(getString(R.string.remove_appointment_message, getInstance().getTitulo()));
					alertYesNo.show();
				}
				break;
			}
		}
	};

	OnClickListener onClickCanceladas = new OnClickListener() {
		
		@Override
		public void onClick(DialogInterface dialog, int which) {
			showProgressBar(ResultSearchAdmActivity.this, null);
			switch (which) {
			case 0:
				loadInstance(AppointmentActivity.class, atividadeService.getColumnHack(), getInstance().getCodigo(), false, R.layout.activity_result_search_adm);
				break;
			case 1:
				duplicate(AppointmentActivity.class, atividadeService.getColumnHack(), getInstance().getCodigo(), R.layout.activity_search_adm);
				break;
			case 2:
				if (getInstance() != null && getInstance().getCodigo() != null){
					processo = ProcessoItem.REATIVAR;
					alertYesNo.setMessage(getString(R.string.enable_appointment_message, getInstance().getTitulo()));
					alertYesNo.show();
				}
				break;
			case 3:
				if (getInstance() != null && getInstance().getCodigo() != null){
					processo = ProcessoItem.EXCLUIR;
					alertYesNo.setMessage(getString(R.string.remove_appointment_message, getInstance().getTitulo()));
					alertYesNo.show();
				}
				break;
			}
		}
	};
	
	OnItemClickListener itemClick = new OnItemClickListener() {
		@Override
		public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
			setInstance( (Atividade) getListView().getItemAtPosition(position));
			if (getInstance().getStatus().equals(StatusAtividade.CONCLUIDA)){
				alertDialogConcluida.setCanceledOnTouchOutside(true);
				alertDialogConcluida.show();
			} else if (getInstance().getStatus().equals(StatusAtividade.CANCELADA)){
					alertDialogCancelada.setCanceledOnTouchOutside(true);
					alertDialogCancelada.show();
			} else {
//				if (getInstance().getPeriodoNotificacao().equals(PeriodoNotificacao.NENHUM)){
					alertDialog = createDialog(getString(R.string.optionsLabel), onClickNaoConcluidas, getOptionsAppointmentMenu());
//				} else
//					alertDialog = createDialog(getString(R.string.optionsLabel), onClickNaoConcluidas, getOptionsRenewAppointmentMenu());
				alertDialog.setCanceledOnTouchOutside(true);
				alertDialog.show();
			}
		}
	};

	public void onClickOpenPopup(View v) {
		Object index = v.getTag();
		if (index instanceof Integer){
			int newIndex = (Integer)index;
			setInstance( (Atividade) getListView().getItemAtPosition(newIndex));
			Dialog dialog = atividadeService.criarPopupAdm(v, getInstance());
			dialog.show();
		}
	}
		
//		OUTRAS SOLU��ES ENCONTRADAS PARA PEGAR O INDICE DO CLICK.
//		int position = getListView().getPositionForView((View) view.getParent());
//	    Buddy buddyToCall = (Buddy) getListView().getItemAtPosition(position);
		
//		final int position = getListView().getPositionForView(v);
//		  String text = getListView().getItemAtPosition(position).toString();
		
}
